<?php

class CategoryController extends Controller
{
	/**
	 * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
	 * using two-column layout. See 'protected/views/layouts/column2.php'.
	 */
//	public $layout='//layouts/column2';
    public function init(){
        $this->setPageTitle('Управление категориями');
    }
	/**
	 * @return array action filters
	 */
	public function filters()
	{
		return array(
			'accessControl', // perform access control for CRUD operations
			'postOnly + delete', // we only allow deletion via POST request
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * @return array access control rules
	 */
	public function accessRules()
	{
		return array(
			array('allow',  // allow all users to perform 'index' and 'view' actions
				'actions'=>array('index','view', 'tree'),
				'users'=>array('*'),
			),
			array('allow', // allow authenticated user to perform 'create' and 'update' actions
				'actions'=>array('create','update','delete', 'xupdate'),
				'users'=>array('@'),
			),
			array('allow', // allow admin user to perform 'admin' and 'delete' actions
				'actions'=>array('admin'),
				'users'=>array('admin'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

	/**
	 * Displays a particular model.
	 * @param integer $id the ID of the model to be displayed
	 */
	public function actionView($id)
	{
		$this->render('view',array(
			'model'=>$this->loadModel($id),
		));
	}

	/**
	 * Creates a new model.
	 * If creation is successful, the browser will be redirected to the 'view' page.
	 */
	public function actionCreate()
	{
		$model=new Category;
		$list = Category::model()->buildDropDownList();
        
        $disabledArray = $model->getDisabledSubCategories();
		// Uncomment the following line if AJAX validation is needed
		$this->performAjaxValidation($model);

        $this->setModel($model);

		$this->render('create',array(
			'model'=>$model,
            'list'=>$list,
            'disabled'=>$disabledArray
		));
	}

	/**
	 * Updates a particular model.
	 * If update is successful, the browser will be redirected to the 'view' page.
	 * @param integer $id the ID of the model to be updated
	 */
	public function actionUpdate($id)
	{
		//$this->layout = '//layouts/default';
		
		$model=$this->loadModel($id);
        $list = Category::model()->buildDropDownList();
		$disabledArray = $model->getDisabledSubCategories();
		// Uncomment the following line if AJAX validation is needed
		$this->performAjaxValidation($model);

        $this->setModel($model, false);

		$this->render('update',array(
			'model'=>$model,
            'list'=>$list,
            'disabled'=>$disabledArray
		));
	}

	/**
	 * Deletes a particular model.
	 * If deletion is successful, the browser will be redirected to the 'admin' page.
	 * @param integer $id the ID of the model to be deleted
	 */
	public function actionDelete($id)
	{
		$model = $this->loadModel($id);
		
		if ($model->products) {
			Yii::app()->user->setFlash('message', 'Эта категория содержит товары');
		}

        if ($model->categories){
            foreach ($model->categories as $category){
                if ($category['parent_id']===$id){
                    $cmodel=$this->loadModel($category['id']);
                    $cmodel->parent_id = $model->parent_id;
                    $cmodel->save();}
            }
        }
        if (!($model->image=='') && file_exists("images/".$model->image)){
            unlink("images/".$model->image);}
        if ($model->delete())
            Yii::app()->user->setFlash('message', 'Удаление прошло успешно.');


        // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
        if(!isset($_GET['ajax']))
            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
	}

	/**
	 * Lists all models.
	 */
	public function actionIndex()
	{
		$dataProvider=new CActiveDataProvider('Category');
		$this->render('index',array(
			'dataProvider'=>$dataProvider,
            'message' => Yii::app()->user->getFlash('message')
		));
	}

    public function actionTree()
    {
        $tree = Category::model()->buildTree();
        $dataProvider=new CActiveDataProvider('Category');
        $this->render('tree',array(
            'dataProvider'=>$dataProvider,
            'tree'=>$tree,
            'message' => Yii::app()->user->getFlash('message')
        ));
    }

	/**
	 * Manages all models.
	 */
	public function actionAdmin()
	{
		$model=new Category('search');

		$model->unsetAttributes();  // clear any default values
		if(isset($_GET['Category']))
			$model->attributes=$_GET['Category'];

		$this->render('admin',array(
			'model'=>$model,
			'message' => Yii::app()->user->getFlash('message')
		));
	}

	/**
	 * Returns the data model based on the primary key given in the GET variable.
	 * If the data model is not found, an HTTP exception will be raised.
	 * @param integer $id the ID of the model to be loaded
	 * @return Category the loaded model
	 * @throws CHttpException
	 */
	public function loadModel($id)
	{
		$model=Category::model()->findByPk($id);
		if($model===null)
			throw new CHttpException(404,'The requested page does not exist.');
		return $model;
	}

	/**
	 * Performs the AJAX validation.
	 * @param Category $model the model to be validated
	 */
	protected function performAjaxValidation($model)
	{
		if(isset($_POST['ajax']) && $_POST['ajax']==='category-form')
		{
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
	}

    public function setModel($model, $create=true)
    {
        if(isset($_POST['Category']))
        {
            $modelImage = $model->image;
            $model->attributes=$_POST['Category'];
            if ($model->parent_id != 0){
				if ($model->id == $this->loadModel($model->parent_id)->parent_id || $model->id == $model->parent_id){
					Yii::app()->user->setFlash('message', 'Категория не может быть родительской для своей родительской категории или себя самой.');
					$this->redirect(array('admin'));
				}
			}
            if (isset($_FILES['categoryImage']['name']) && $_FILES['categoryImage']['name'] !== ""){
                if (!($modelImage=='') && file_exists("images/".$model->image)){
                    unlink("images/".$model->image);}
                $saveto = ImageFunctions::loadImage ($_FILES['categoryImage'], md5(time()), ImageFunctions::$lImageSize);
                $imageName=$saveto['result'];
            }
            else{
                $imageName = $model->image;}
            $model->image=$imageName;
            if($model->save()){
				if ($create == true) {
					Yii::app()->user->setFlash('message', 'Категория успешно создана.');
				} else {
					Yii::app()->user->setFlash('message', 'Категория успешно обновлена.');
                }
                $this->redirect(array('admin'));
			}
        }
    }
    

    //обновление с помощью x-editable
    public function actionXUpdate()

    {
        $xEditable = new EditableSaver('Category');
        if ($xEditable->update()){
			Yii::app()->user->setFlash('message', 'Категория успешно обновлена.');
            $this->redirect(array('admin'));
		}
    }
}
